// File: jmcomic-core/src/main/java/dev/jukomu/jmcomic/exception/JmcomicException.java
package dev.jukomu.jmcomic.exception;

import java.util.Collections;
import java.util.Map;

/**
 * 对应Python的JmcomicException，是所有jmcomic库自定义异常的基类。
 */
public class JmcomicException extends RuntimeException {

    public static final String DESCRIPTION = "jmcomic 模块异常";

    // 存储异常上下文信息
    private final Map<String, Object> context;

    /**
     * 构造函数。
     *
     * @param message 异常消息
     * @param context 异常上下文Map
     */
    public JmcomicException(String message, Map<String, Object> context) {
        super(message);
        this.context = (context != null) ? Collections.unmodifiableMap(context) : Collections.emptyMap();
    }

    /**
     * 构造函数。
     *
     * @param message 异常消息
     * @param context 异常上下文Map
     * @param cause   原始异常
     */
    public JmcomicException(String message, Map<String, Object> context, Throwable cause) {
        super(message, cause);
        this.context = (context != null) ? Collections.unmodifiableMap(context) : Collections.emptyMap();
    }

    /**
     * 从上下文中获取指定键的值。
     *
     * @param key 键
     * @param <T> 返回类型
     * @return 上下文中的值
     * @throws ClassCastException 如果类型转换失败
     */
    @SuppressWarnings("unchecked")
    public <T> T fromContext(String key) {
        return (T) context.get(key);
    }

    /**
     * 获取异常上下文Map。
     *
     * @return 不可修改的上下文Map
     */
    public Map<String, Object> getContext() {
        return context;
    }

    @Override
    public String toString() {
        return getClass().getName() + ": " + getMessage() + " (context=" + context + ")";
    }
}